#pragma once
#include <mutex>
#include <deque>
#include <functional>
#include <optional>
#include <condition_variable>
#include "Logger.h"

namespace GiSo {

class TaskQueue {
public:
    using Task = std::function<void()>;

    using Ptr = std::shared_ptr<TaskQueue>;

    TaskQueue() = default;

    // 提交任务到队列
    void PushBack(Task task) {
        std::lock_guard<std::mutex> lock(m_Mutex);
        m_Queue.push_back(std::move(task));
        m_Cv.notify_one(); // 通知等待的线程
    }

    // 从队列取任务
    std::optional<Task> PopFront() {
        std::lock_guard<std::mutex> lock(m_Mutex);
        if (m_Queue.empty()) {
            return std::nullopt;
        }
        Task task = std::move(m_Queue.front());
        m_Queue.pop_front();
        return task;
    }

    // 检查队列是否为空
    bool Empty() const {
        std::lock_guard<std::mutex> lock(m_Mutex);
        return m_Queue.empty();
    }

    // 获取条件变量引用（供线程池绑定）
    std::condition_variable& GetConditionVariable() {
        return m_Cv;
    }

    // 获取互斥锁引用（供线程池绑定）
    std::mutex& GetMutex() {
        return m_Mutex;
    }

private:
    std::deque<Task> m_Queue;
    mutable std::mutex m_Mutex; // mutable 允许 const 方法加锁
    std::condition_variable m_Cv; // 条件变量，用于通知
};

} // namespace GiSo
